import json
import openpyxl as xl
import pandas as pd
import numpy as np
import os

# 读取 JSON 文件的函数
def read_json_file(file_path):
    """
    读取 JSON 文件并返回解析后的内容

    参数：
    file_path (str)：JSON 文件的路径

    返回：
    dict：解析后的 JSON 数据
    """
    try:
        with open(file_path, mode='r', encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到")
        return None
    except json.JSONDecodeError:
        print(f"文件 {file_path} 不是有效的 JSON 格式")
        return None

# 读取输入 Excel 文件的函数
def read_input_file(file_path, sheet_name, columns):
    """
    读取指定的 Excel 文件的指定工作表和列

    参数：
    file_path (str)：Excel 文件的路径
    sheet_name (str)：要读取的工作表名称
    columns (list)：要读取的列名列表

    返回：
    DataFrame：读取的数据
    """

    try:
        return pd.read_excel(file_path, sheet_name=sheet_name, index_col=False, usecols=columns, dtype={"任务单号": str, "企业名称": str})
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到")
        return None

# 保留工作表的函数
def retain_sheets(info, combin_file_path, save_path):
    """
    根据给定的工作表信息，从综合工作簿中保留指定的工作表并保存

    参数：
    info (dict)：包含工作簿名和对应的工作表列表的字典
    combin_file_path (str)：综合工作簿的路径
    save_path (str)：保存新工作簿的路径
    """
    try:
        work_book = xl.load_workbook(combin_file_path)
        all_sheets = work_book.worksheets
        for sheet in all_sheets:
            if sheet.title not in [item for sublist in info.values() for item in sublist]:
                work_book.remove(sheet)
        creat_file = os.path.join(save_path, "".join(info.keys()) + ".xlsx")
        if os.path.exists(creat_file):
            pass
        else:
            work_book.save(creat_file)
            work_book.close()
    except Exception as e:
        print(f"在处理工作表时出现错误: {e}")

# 主运行函数
def run():
    """
    主运行函数，执行整个流程
    """
    input_file = "E:\实验记录\原始记录表格\实验数据\实验记录2024.xlsm"
    combin_file = "实验项目汇总.xlsx"
    json_file = "项目对应工作表.json"
    save_path = r"E:\实验记录\原始记录表格\实验数据\2024年/"
    os.chdir(r"E:\实验记录\原始记录表格\实验数据\创建原始记录")

    all_factor = read_json_file(json_file)
    if all_factor is None:
        return

    input_table = read_input_file(input_file, "创建表", "A:C")
    if input_table is None:
        return

    input_table["工作簿名"] = input_table["任务单号"] + input_table["企业名称"]
    file_name = list(set(input_table["任务单号"] + input_table["企业名称"]))

    for i in file_name:
        info_dict = {}
        work_sheets = [["修约规则"]]
        condition = input_table["工作簿名"] == i
        factor = list(np.array(input_table["检测项目"][condition]))
        for j in factor:
            if j in all_factor:
                work_sheets.append(all_factor[j])
        new_list = [ele for sub in work_sheets for ele in sub]
        info_dict[i] = new_list
        retain_sheets(info_dict, combin_file, save_path)

if __name__ == "__main__":
    run()



